メインコンテンツへスキップ
  1. ブログ投稿/

機械学習 - グリッドサーチ(Grid Search)

機械学習でモデルの最適なパラメータを見つけるための効率的な方法の一つはグリッドサーチ(Grid Search)です。この投稿では、グリッドサーチとは何か、どのように機能するか、そしていつ使用すべきかについて説明します。

グリッドサーチとは? #

グリッドサーチは、機械学習モデルのハイパーパラメータを最適化するための方法の一つです。この方法は指定されたハイパーパラメータのすべての組み合わせを試し、最も良い性能を発揮するパラメータの組み合わせを見つけます。各パラメータの組み合わせに対してクロスバリデーションを実施し、モデルの性能を評価します。このプロセスを通じて、最適なモデルを選択することができます。

動作原理 #

グリッドサーチは、まずユーザーが指定したハイパーパラメータの範囲やリストを入力として受け取ります。例えば、決定木分類器に対するグリッドサーチを行うとします。ユーザーは、木の深さ(depth)、分割のための最小サンプル数(min_samples_split)などのハイパーパラメータの範囲を設定します。グリッドサーチは、この範囲内のすべての可能な組み合わせに対してモデルを学習させ、クロスバリデーションを使用して各組み合わせの性能を評価します。性能評価方法としては、通常、正確度、精度、再現率、F1スコアなどが使用されます。評価が終わった後、最も性能が良いパラメータの組み合わせが選択されます。

長所と短所 #

長所:

  • 使いやすく、理解しやすい
  • すべての可能な組み合わせを探索するため、最適な組み合わせを見つける可能性が高い

短所:

  • 計算コストが非常に高い。パラメータの数と範囲が大きくなるほど、必要な計算量が指数関数的に増加
  • 最適な組み合わせを見つけるのに時間がかかる

利用用途 #

グリッドサーチは、パラメータの範囲が比較的小さく、モデルの学習時間が短い場合に適しています。また、最適なハイパーパラメータの組み合わせを見つけることが重要で、計算リソースが十分にある場合に使用すると良いでしょう。しかし、パラメータ空間が非常に大きい場合や、学習時間が非常に長いモデルの場合は、ランダムサーチ(Random Search)、ベイジアン最適化などの他のハイパーパラメータ最適化技術を検討することが望ましいです。

GridSearchCV #

GridSearchCVは、Scikit-learnライブラリのモデル選択モジュールに含まれるクラスで、与えられたモデルのハイパーパラメータ空間を交差検証を通じて探索し、最適なパラメータを見つけるために使用されます。このクラスのコンストラクターに渡すことができる主要なパラメータは以下の通りです:

主要パラメータ #

  1. estimator: 最適化するモデル。例えば、RandomForestClassifier()、SVC()などのscikit-learnの推定器(estimator)オブジェクトがこれに該当します。
  2. param_grid: 探索するパラメータの辞書。例えば、{’n_estimators’: [100, 200], ‘max_features’: [‘auto’, ‘sqrt’]}のように設定でき、これはn_estimatorsとmax_featuresパラメータに対してそれぞれ[100, 200]と[‘auto’, ‘sqrt’]の値を探索することを意味します。
  3. scoring: モデルの性能を評価する基準。文字列で指定され、例えば「accuracy」、「f1」などが使用されます。scikit-learnで事前定義された他のscoringオプションを使用することもできます。
  4. cv: 交差検証分割戦略。例えば、5は5分割交差検証を意味します。KFold、StratifiedKFoldなどのscikit-learnの分割器(splitter)オブジェクトを直接渡すこともできます。
  5. refit: 最適なパラメータを見つけた後、全データセットに対してモデルを再学習するかどうかを決定します。デフォルト値はTrueで、最適なパラメータで全データセットに対してモデルを学習します。

GridSearchCVの実装 #

以下は、Scikit-learnのGridSearchCVを使用して分類器の最適なハイパーパラメータを見つける簡単な例です。ここでは、決定木分類器(DecisionTreeClassifier)を使用します。

>>> from sklearn.model_selection import GridSearchCV
>>> from sklearn.tree import DecisionTreeClassifier
>>> from sklearn.datasets import load_iris
>>> from sklearn.model_selection import train_test_split

# データをロードする
>>> iris = load_iris()
>>> X = iris.data
>>> y = iris.target

# 訓練セットとテストセット分割
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# モデル設定
>>> estimator = DecisionTreeClassifier()

# 探索するパラメータグリッド設定
>>> param_grid = {
    	'max_depth': [None, 2, 4, 6, 8],
    	'min_samples_split': [2, 5, 10],
    	'min_samples_leaf': [1, 2, 4]
	}

# GridSearchCV設定
>>> grid_search = GridSearchCV(estimator=estimator, param_grid=param_grid, scoring='accuracy', cv=5, refit=True)

# グリッドサーチ実行
>>> grid_search.fit(X_train, y_train)

# 最適パラメータと最高スコア出力
>>> print("Best parameters:", grid_search.best_params_)
>>> print("Best score:", grid_search.best_score_)

# テストデータでの性能評価
>>> test_accuracy = grid_search.score(X_test, y_test)
>>> print("Test accuracy:", test_accuracy)